ArgoCD Basic
简介
Argo CD 是以 Kubernetes 作为基础设施,遵循声明式 GitOps 理念的持续交付(continuous delivery, CD)工具,支持多种配置管理工具,包括 ksonnet/jsonnet、kustomize 和 Helm 等。它的配置和使用非常简单,并且自带一个简单易用的可视化界面。
按照官方定义,Argo CD 被实现为一个 Kubernetes 控制器,它会持续监控正在运行的应用,并将当前的实际状态与 Git 仓库中声明的期望状态进行比较,如果实际状态不符合期望状态,就会更新应用的实际状态以匹配期望状态。
部署到k8s
使用helm chart
$ helm repo add argo https://argoproj.github.io/argo-helm
$ helm install argocd argo/argo-cd -n argocd ----create-namespace argocd
部署完之后可以配置一个nginx ingress进行外部访问:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-argo
namespace: argo
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
rules:
- host: argocd.nblh.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
number: 443
ingressClassName: nginx
---
这样就可以通过域名加Nodeport的方式进行访问.
使用yaml
kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
argocd CLI
argocd CLI是argocd的命令行工具.
安装
# macos 下使用brew安装
brew install argocd
其他平台可以从Release v2.8.4 · argoproj/argo-cd · GitHub这里进行下载.
登录
登录到argocd server:
# 后面的地址是nginx ingress的地址
argocd login argocd.nblh.local:37332
# 随后允许不安全的证书,输入账号密码即可
登录完之后会生成一个配置文件,配置文件路径为:
❯ cat ~/.config/argocd/config
───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: /Users/agou-ops/.config/argocd/config
───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ contexts:
2 │ - name: argocd.nblh.local:37332
3 │ server: argocd.nblh.local:37332
4 │ user: argocd.nblh.local:37332
5 │ current-context: argocd.nblh.local:37332
6 │ servers:
7 │ - grpc-web-root-path: ""
8 │ insecure: true
9 │ server: argocd.nblh.local:37332
10 │ users:
11 │ - auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJhZG1pbjpsb2dpbiIsImV4cCI6MTY5NDc0MzU3OCwibmJmIjoxNjk0NjU3MTc4LCJpYXQiOjE2OTQ2NTcx
│ NzgsImp0aSI6ImNkMDhmYTgzLTQ3MDEtNDdjNC05YzI2LWExNDZhZmQ0YzJiYiJ9.i_VhZYmI5AaqWn0e7YE3F_OeLrj-xmhB6ZeAmiINpTM
12 │ name: argocd.nblh.local:37332
───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
常用命令
# 列举所有应用
$ argocd app list
# 查看应用状态
$ argocd app get dubbo-sample
# output
Name: argo/dubbo-sample
Project: default
Server: https://kubernetes.default.svc
Namespace: dubbo
URL: https://argocd.nblh.local:37332/applications/dubbo-sample
Repo: http://git.nblh.local/devops/sample-project.git
Target: gitops
Path: 1-basic/dubbo-samples-spring-boot/helm-chart
Helm Values: values.yaml
SyncWindow: Sync Allowed
Sync Policy: Automated
Sync Status: OutOfSync from gitops (bb71241)
Health Status: Healthy
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
apps Deployment dubbo dubbo-admin-16 OutOfSync Healthy ignored (requires pruning)
apps Deployment dubbo dubbo-consumer-16 OutOfSync Healthy ignored (requires pruning)
apps Deployment dubbo dubbo-provider-16 OutOfSync Healthy ignored (requires pruning)
apps Deployment dubbo dubbo-admin-17 Synced Healthy deployment.apps/dubbo-admin-17 created
apps Deployment dubbo dubbo-consumer-17 Synced Healthy deployment.apps/dubbo-consumer-17 created
apps Deployment dubbo dubbo-provider-17 Synced Healthy deployment.apps/dubbo-provider-17 created
# 从上面输出可以看到应用目前处于OutofSync,可以使用一下命令同步应用,ApplyOutOfSyncOnly仅同步outsync
$ argocd app sync dubbo-sample --sync-option ApplyOutOfSyncOnly=true
# output
# 输出太长就不放了,可以通过上面的argocd app get 命令查看同步结果
使用示例
使用清单文件
示例清单文件:
# application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp-argo-application
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/USER/REPO.git
targetRevision: HEAD
path: dev
destination:
server: https://kubernetes.default.svc
namespace: myapp
syncPolicy:
syncOptions:
- CreateNamespace=true
automated:
selfHeal: true
prune: true
参数解释:
syncPolicy : 指定自动同步策略和频率,不配置时需要手动触发同步。
syncOptions : 定义同步方式。
- CreateNamespace=true : 如果不存在这个 namespace,就会自动创建它。
automated : 检测到实际状态与期望状态不一致时,采取的同步措施。
- selfHeal : 当集群世纪状态不符合期望状态时,自动同步。
- prune : 自动同步时,删除 Git 中不存在的资源。
Argo CD 默认情况下每 3 分钟会检测 Git 仓库一次,用于判断应用实际状态是否和 Git 中声明的期望状态一致,如果不一致,状态就转换为
OutOfSync
。默认情况下并不会触发更新,除非通过syncPolicy
配置了自动同步。如果嫌周期性同步太慢了,也可以通过设置 Webhook 来使 Git 仓库更新时立即触发同步。具体的使用方式会放到后续的教程中,本文不再赘述。
仓库dev路径下:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
selector:
matchLabels:
app: myapp
replicas: 2
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: nginx:latest
ports:
- containerPort: 80
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- port: 80
protocol: TCP
targetPort: 80
最后创建application即可:
kubectl apply -f application.yaml
打开argocd的web页面可以看到新创建的应用。
使用argocd客户端工具
kubectl config set-context --current --namespace=argocd
argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default